import pandas as pd

# 假设两个Excel文件路径（请替换为实际路径）
# file1 = 'D:\\project_file\\老卷下线\\20250923周末智学和E讲堂目录使用到的课程包标记.xlsx'  # 第一个Excel文件

file1 = 'D:\\project_file\\老卷下线\\20250923周末智学和E讲堂目录使用到的课程包标记.xlsx'

# file2 = 'D:\\project_file\\老卷下线\\20250923E讲堂目录老卷的课程包的目录信息.xlsx'  # 第二个Excel文件
file2 = 'D:\\project_file\\老卷下线\\20250915支持业务中台老卷使用排查\\2025-09-15-15-18-14_EXPORT_XLSX_21357653_723_0.xlsx'  # 第二个Excel文件

d_type = {
    '讲课后习题原卷id': str
}

# 读取两个Excel文件
df1 = pd.read_excel(file1, dtype=d_type)
df2 = pd.read_excel(file2, dtype=d_type)


# 对第一个Excel进行过滤：'是否在E讲堂目录中使用' == '是' 和 '是否老卷/含老题' == 1
# 注意：确保列名准确，如果有空格或不同，请调整
# df1_filtered = df1[
#     (df1['是否在E讲堂目录中使用'] == '是') &
#     (df1['是否老卷/含老题'] == 1)
# ]

df1_filtered = df1


# 对第二个Excel根据'讲id'和'包id'去重
df2 = df2.drop_duplicates(subset=['讲id', '包id'])

# 找到两个DataFrame的共同列
common_cols = list(set(df1_filtered.columns) & set(df2.columns))

# 只保留共同列
df1_common = df1_filtered[common_cols]
df2_common = df2[common_cols]

# 使用'讲id'和'包id'作为键进行合并，outer join以找出所有差异
merged = pd.merge(
    df1_common,
    df2_common,
    on=['讲id', '包id'],
    how='outer',
    indicator=True,
    suffixes=('_file1', '_file2')
)

# 过滤出差异行：不在both中的，或者值不同的
# 1. 找出不在both的行
not_both = merged[merged['_merge'] != 'both']

# 2. 对于both的行，检查其他列的值是否不同
both = merged[merged['_merge'] == 'both']
diff_cols = [col for col in common_cols if col not in ['讲id', '包id']]  # 排除键列

# 创建一个掩码，检查是否有任何列不同
mask = pd.Series(False, index=both.index)
for col in diff_cols:
    # 处理NaN值：将NaN视为相同（如果需要不同行为，可以调整）
    mask |= (both[f'{col}_file1'].fillna('') != both[f'{col}_file2'].fillna(''))

value_diffs = both[mask]

# 合并所有差异
all_diffs = pd.concat([not_both, value_diffs])

# 统计差异
print("总差异行数:", len(all_diffs))
print("仅在第一个Excel中的行数:", len(merged[merged['_merge'] == 'left_only']))
print("仅在第二个Excel中的行数:", len(merged[merged['_merge'] == 'right_only']))
print("共同行但值不同的行数:", len(value_diffs))

# 输出差异详情到新Excel
all_diffs.to_excel('differences.xlsx', index=False)
print("差异详情已保存到 differences.xlsx")